package pe.gob.osinergmin.activity;

import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TableLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;

import org.apache.http.Header;
import org.apache.http.entity.StringEntity;
import org.json.JSONArray;
import org.json.JSONObject;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import pe.gob.osinergmin.R;
import pe.gob.osinergmin.activity.generic.GenericBackActionBarActivity;
import pe.gob.osinergmin.bean.SupervisionMovil;
import pe.gob.osinergmin.bean.SupervisionMovilDetalleSCOP;
import pe.gob.osinergmin.bean.SupervisionMovilDetalleSeguridad;
import pe.gob.osinergmin.bean.common.GuiaFiscalizacionDetalle;
import pe.gob.osinergmin.bean.common.OrdenPedido;
import pe.gob.osinergmin.bean.common.Producto;
import pe.gob.osinergmin.bean.common.UnidadOperativa;
import pe.gob.osinergmin.bean.common.Usuario;
import pe.gob.osinergmin.bean.sync.SupervisionMovilSCOP;
import pe.gob.osinergmin.bean.sync.SupervisionMovilSeguridad;
import pe.gob.osinergmin.utils.PuntoControlConstants;
import pe.gob.osinergmin.utils.PuntoControlUtils;

import static pe.gob.osinergmin.utils.PuntoControlConstants.SESSION_USER_VAR;

public class ConfigActivity extends GenericBackActionBarActivity {

    public int _toolbar = R.id.config_toolbar;

    private Usuario usuario;

    private AutoCompleteTextView txtPlaca;
    private ImageView imgClearPlaca;

    private AnimationDrawable imgSyncSCOP;
    private AnimationDrawable imgSyncSeguridad;

    private AnimationDrawable imgSyncProducto;
    private AnimationDrawable imgSyncUnidadOperativa;
    private AnimationDrawable imgSyncGuiaFiscalizacion;
    private AnimationDrawable imgSyncOrdenPedido;

    private TextView txtFaltantesSCOP;

    private TextView txtFaltantesSeguridad;

    private String[] placaList;

    private ConfigActivity configActivity = this;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.module_config);
        setToolbar((Toolbar) findViewById(_toolbar));
        setSupportActionBar(getToolbar());
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);

        usuario = (Usuario)getIntent().getExtras().getSerializable(SESSION_USER_VAR);

        writeStatusBar();

        LinearLayout btnRegresar = (LinearLayout)getToolbar().findViewById(R.id.btnRegresar);
        btnRegresar.setOnClickListener(this);

        ImageView btnSyncSCOP = (ImageView) findViewById(R.id.btnSyncSCOP);
        btnSyncSCOP.setOnClickListener(this);
        imgSyncSCOP = (AnimationDrawable)btnSyncSCOP.getDrawable();
        imgSyncSCOP.stop();

        ImageView btnSyncSeguridad = (ImageView) findViewById(R.id.btnSyncSeguridad);
        btnSyncSeguridad.setOnClickListener(this);
        imgSyncSeguridad = (AnimationDrawable)btnSyncSeguridad.getDrawable();
        imgSyncSeguridad.stop();

        ImageView btnSyncProducto = (ImageView) findViewById(R.id.btnSyncProducto);
        btnSyncProducto.setOnClickListener(this);
        imgSyncProducto = (AnimationDrawable)btnSyncProducto.getDrawable();
        imgSyncProducto.stop();

        ImageView btnSyncUnidadOperativa = (ImageView) findViewById(R.id.btnSyncUnidadOperativa);
        btnSyncUnidadOperativa.setOnClickListener(this);
        imgSyncUnidadOperativa = (AnimationDrawable)btnSyncUnidadOperativa.getDrawable();
        imgSyncUnidadOperativa.stop();

        ImageView btnSyncGuiaFiscalizacion = (ImageView) findViewById(R.id.btnSyncGuiaFiscalizacion);
        btnSyncGuiaFiscalizacion.setOnClickListener(this);
        imgSyncGuiaFiscalizacion = (AnimationDrawable)btnSyncGuiaFiscalizacion.getDrawable();
        imgSyncGuiaFiscalizacion.stop();

        ImageView btnSyncOrdenPedido = (ImageView) findViewById(R.id.btnSyncOrdenPedido);
        btnSyncOrdenPedido.setOnClickListener(this);
        imgSyncOrdenPedido = (AnimationDrawable)btnSyncOrdenPedido.getDrawable();
        imgSyncOrdenPedido.stop();

        try {
            placaList = getUnidadOperativaService().getUnidadOperativaPlacaList(this);
        }catch(Exception e){
            e.printStackTrace();
        }

        imgClearPlaca = (ImageView) findViewById(R.id.txtPlaca_clear);
        imgClearPlaca.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                txtPlaca.setText(PuntoControlConstants.EMPTY);
                imgClearPlaca.setVisibility(View.INVISIBLE);
            }
        });

        if(placaList != null) {
            // Se crea el adaptador de autocomplete
            ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(configActivity, android.R.layout.simple_dropdown_item_1line, placaList);

            txtPlaca = (AutoCompleteTextView) findViewById(R.id.txtPlaca);
            txtPlaca.setThreshold(2); // in 1 characteres will show autocomplete
            txtPlaca.setAdapter(arrayAdapter);
            txtPlaca.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {

                }

                @Override
                public void afterTextChanged(Editable s) {
                    imgClearPlaca.setVisibility(s.length() > 0 ? View.VISIBLE : View.INVISIBLE);
                }
            });
            txtPlaca.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    try {
                        int index = -1;
                        for (int i = 0; i < placaList.length; i++) {
                            String placa = placaList[i];
                            TextView _view = (TextView) view;
                            if (placa.equals(_view.getText().toString())) {
                                index = i;
                                break;
                            }
                        }
                        if (index != -1) {
                            PuntoControlConstants.unidadOperativa = getUnidadOperativaService().getUnidadOperativaList(configActivity, null).get(index);
                            hideSoftKeyboard(txtPlaca);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }

        txtFaltantesSCOP = (TextView) findViewById(R.id.txtFaltantesSCOP);
        txtFaltantesSCOP.setText(String.valueOf(getSupervisionMovilService().getSupervisionScopPendiente()));
        TextView txtTotalSCOP = (TextView) findViewById(R.id.txtTotalSCOP);
        txtTotalSCOP.setText(String.valueOf(getSupervisionMovilService().getSupervisionScopTotal()));

        txtFaltantesSeguridad = (TextView) findViewById(R.id.txtFaltantesSeguridad);
        txtFaltantesSeguridad.setText(String.valueOf(getSupervisionMovilService().getSupervisionSeguridadPendiente()));
        TextView txtTotalSeguridad = (TextView) findViewById(R.id.txtTotalSeguridad);
        txtTotalSeguridad.setText(String.valueOf(getSupervisionMovilService().getSupervisionSeguridadTotal()));

        // Cargando la información

        txtPlaca.setText((PuntoControlConstants.unidadOperativa != null && !PuntoControlConstants.EMPTY.equals(PuntoControlConstants.unidadOperativa.getPlaca())) ? PuntoControlConstants.unidadOperativa.getPlaca(): PuntoControlConstants.EMPTY);

        if(!PuntoControlConstants.EMPTY.equals(txtPlaca.getText().toString())) {
            hideSoftKeyboard(txtPlaca);
            txtPlaca.setFocusable(false);
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btnRegresar:
                this.finish();
                break;
            case R.id.btnSyncSCOP:
                if(!PuntoControlUtils.validateConnectivity(configActivity)){
                    showToast(configActivity, R.string.config_sincronizar_internet_problem, Toast.LENGTH_SHORT);
                    break;
                }
                if(!imgSyncSCOP.isRunning()) {
                    imgSyncSCOP.start();
                    Integer faltanteSCOP = Integer.parseInt(txtFaltantesSCOP.getText().toString());
                    if (faltanteSCOP > 0) {
                        sendSupervisionScopToServer();
                    } else {
                        // Se muestra mensaje que no quedan pendientes de sincronizar
                        showToast(configActivity, R.string.error_dont_have_scop_to_sync, Toast.LENGTH_SHORT);
                        imgSyncSCOP.stop();
                    }
                }else{
                    showToast(configActivity, R.string.config_supervisiones_scop_ejecutada, Toast.LENGTH_SHORT);
                }
                break;
            case R.id.btnSyncSeguridad:
                if(!PuntoControlUtils.validateConnectivity(configActivity)){
                    showToast(configActivity, R.string.config_sincronizar_internet_problem, Toast.LENGTH_SHORT);
                    break;
                }
                if(!imgSyncSeguridad.isRunning()){
                    imgSyncSeguridad.start();
                    Integer faltanteSeguridad = Integer.parseInt(txtFaltantesSeguridad.getText().toString());
                    if (faltanteSeguridad > 0) {
                        sendSupervisionSeguridadToServer();
                    } else {
                        // Se muestra mensaje que no quedan pendientes de sincronizar
                        showToast(configActivity, R.string.error_dont_have_seguridad_to_sync, Toast.LENGTH_SHORT);
                        imgSyncSeguridad.stop();
                    }
                }else{
                    showToast(configActivity, R.string.config_supervisiones_seguridad_ejecutada, Toast.LENGTH_SHORT);
                }
                break;
            case R.id.btnSyncProducto:
                if(!PuntoControlUtils.validateConnectivity(configActivity)){
                    showToast(configActivity, R.string.config_sincronizar_internet_problem, Toast.LENGTH_SHORT);
                    break;
                }
                if (!imgSyncProducto.isRunning()) {
                    imgSyncProducto.start();
                    getProductoFromServer();
                }else{
                    showToast(configActivity, R.string.config_sincronizar_productos_ejecutada, Toast.LENGTH_SHORT);
                }
                break;
            case R.id.btnSyncUnidadOperativa:
                if(!PuntoControlUtils.validateConnectivity(configActivity)){
                    showToast(configActivity, R.string.config_sincronizar_internet_problem, Toast.LENGTH_SHORT);
                    break;
                }
                if (!imgSyncUnidadOperativa.isRunning()) {
                    imgSyncUnidadOperativa.start();
                    getUnidadOperativaFromServer();
                }else{
                    showToast(configActivity, R.string.config_sincronizar_unidades_operativas_ejecutada, Toast.LENGTH_SHORT);
                }
                break;
            case R.id.btnSyncGuiaFiscalizacion:
                if(!PuntoControlUtils.validateConnectivity(configActivity)){
                    showToast(configActivity, R.string.config_sincronizar_internet_problem, Toast.LENGTH_SHORT);
                    break;
                }
                if (!imgSyncGuiaFiscalizacion.isRunning()) {
                    imgSyncGuiaFiscalizacion.start();
                    getGuiaFiscalizacionFromServer();
                }else{
                    showToast(configActivity, R.string.config_sincronizar_guia_fiscalizacion_ejecutada, Toast.LENGTH_SHORT);
                }
                break;
            case R.id.btnSyncOrdenPedido:
                if(!PuntoControlUtils.validateConnectivity(configActivity)){
                    showToast(configActivity, R.string.config_sincronizar_internet_problem, Toast.LENGTH_SHORT);
                    break;
                }
                if (!imgSyncOrdenPedido.isRunning()){
                    imgSyncOrdenPedido.start();
                    getOrdenPedidoFromServer();
                }else{
                    showToast(configActivity, R.string.config_sincronizar_orden_pedido_ejecutada, Toast.LENGTH_SHORT);
                }
                break;
            default:
                break;
        }
    }

    private void writeStatusBar(){
        // Colocando la bienvenida
        TableLayout tableLayout = (TableLayout) findViewById(R.id.config_status_bar);
        TextView nombre = (TextView) tableLayout.findViewById(R.id.status_bar_nombre);
        String txtNombre = MessageFormat.format(getResources().getString(R.string.menu_welcome), usuario.getNombreCompleto());
        nombre.setText(txtNombre);

        TextView placa = (TextView)tableLayout.findViewById(R.id.status_bar_placa);
        if(PuntoControlConstants.unidadOperativa != null && (!PuntoControlConstants.EMPTY.equals(PuntoControlConstants.unidadOperativa.getPlaca()) && PuntoControlConstants.unidadOperativa.getPlaca() != null)){
            String txtPlaca = MessageFormat.format(getResources().getString(R.string.menu_placa), PuntoControlConstants.unidadOperativa.getPlaca());
            placa.setText(txtPlaca);
        }else{
            placa.setText(PuntoControlConstants.EMPTY);
        }
    }

    private void sendSupervisionScopToServer(){

        AsyncHttpClient client = new AsyncHttpClient();
        String url = PuntoControlConstants.URL_SUPERVISION_MOVIL_SCOP_SAVE_LIST;
        try{
            JSONObject jsonParams = new JSONObject();
            SupervisionMovil supervisionMovil = new SupervisionMovil();
            supervisionMovil.setTipo(PuntoControlConstants.tipoSupervision.SCOP);
            supervisionMovil.setEstado(PuntoControlConstants.estadoSupervision.REGISTRADA);
            supervisionMovil.setTramo(null);
            List<SupervisionMovil> supervisionMovilList = getSupervisionMovilService().getSupervisionMovilList(configActivity, supervisionMovil);
            final List<SupervisionMovilSCOP> supervisionMovilSCOPList = new ArrayList<>();
            if(supervisionMovilList != null) {
                for (SupervisionMovil _supervisionMovil : supervisionMovilList) {
                    SupervisionMovilDetalleSCOP supervisionMovilDetalleSCOP = new SupervisionMovilDetalleSCOP();
                    supervisionMovilDetalleSCOP.setFechaRegistro(_supervisionMovil.getFechaRegistro());
                    supervisionMovilDetalleSCOP.setPlaca(_supervisionMovil.getPlaca());
                    List<SupervisionMovilDetalleSCOP> detalle = getSupervisionMovilDetalleScopService().getSupervisionMovilDetalleSCOPList(configActivity, supervisionMovilDetalleSCOP);
                    SupervisionMovilSCOP supervisionMovilSCOP = new SupervisionMovilSCOP();
                    supervisionMovilSCOP.setTipo(_supervisionMovil.getTipo());
                    supervisionMovilSCOP.setTramo(_supervisionMovil.getTramo());
                    supervisionMovilSCOP.setPlaca(_supervisionMovil.getPlaca());
                    supervisionMovilSCOP.setCodigoOsinergmin(_supervisionMovil.getCodigoOsinergmin());
                    supervisionMovilSCOP.setRazonSocial(_supervisionMovil.getRazonSocial());
                    supervisionMovilSCOP.setRuc(_supervisionMovil.getRuc());
                    supervisionMovilSCOP.setLatitud(_supervisionMovil.getLatitud());
                    supervisionMovilSCOP.setLongitud(_supervisionMovil.getLongitud());
                    supervisionMovilSCOP.setFechaRegistro(_supervisionMovil.getFechaRegistro());
                    supervisionMovilSCOP.setUsuario(_supervisionMovil.getUsuario());
                    supervisionMovilSCOP.setEstado(_supervisionMovil.getEstado());
                    supervisionMovilSCOP.setObservacion(_supervisionMovil.getObservacion());
                    supervisionMovilSCOP.setDetalle(detalle);
                    supervisionMovilSCOPList.add(supervisionMovilSCOP);
                }
            }
            jsonParams.put("info",supervisionMovilSCOPList);
            Log.d("<ConfigActivity:sendSupervisionScopToServer:supervisionMovilSCOPList>",jsonParams.toString());
            StringEntity stringEntity = new StringEntity(jsonParams.toString());
            client.post(configActivity, url, stringEntity, "application/json", new AsyncHttpResponseHandler() {

                @Override
                public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                    try {
                        List<SupervisionMovil> supervisionMovilList = getSupervisionMovilService().getSupervisionMovilList(configActivity, null);
                        for(SupervisionMovilSCOP supervisionMovilSCOP : supervisionMovilSCOPList){
                            for(SupervisionMovil supervisionMovil : supervisionMovilList){
                                if(supervisionMovil.getTipo().equals(PuntoControlConstants.tipoSupervision.SCOP)){
                                    if(supervisionMovilSCOP.getFechaRegistro().equals(supervisionMovil.getFechaRegistro())) {
                                        supervisionMovil.setEstado(PuntoControlConstants.estadoSupervision.ENVIADA);
                                    }
                                }
                            }
                        }
                        getSupervisionMovilService().saveSupervisionMovilListToLocal(configActivity, supervisionMovilList);
                        txtFaltantesSCOP.setText(getSupervisionMovilService().getSupervisionScopPendiente());
                        imgSyncSCOP.stop();
                        showToast(configActivity, R.string.config_supervisiones_scop_finalizada, Toast.LENGTH_SHORT);
                    } catch (Exception e) {
                        imgSyncSCOP.stop();
                        showToast(configActivity, R.string.error_json_generic, Toast.LENGTH_SHORT);
                    }
                }


                @Override
                public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                    imgSyncSCOP.stop();
                    if (statusCode == 404) {
                        showToast(configActivity, R.string.error_http_404, Toast.LENGTH_SHORT);
                    }
                    // When Http response code is '500'
                    else if (statusCode == 500) {
                        showToast(configActivity, R.string.error_http_500, Toast.LENGTH_SHORT);
                    }
                    // When Http response code other than 404, 500
                    else {
                        showToast(configActivity, R.string.error_http_other, Toast.LENGTH_SHORT);
                    }
                }
            });
        }catch(Exception e){
            imgSyncSCOP.stop();
            showToast(configActivity, R.string.error_json_generic, Toast.LENGTH_SHORT);
        }
    }

    private void sendSupervisionSeguridadToServer(){
        AsyncHttpClient client = new AsyncHttpClient();
        String url = PuntoControlConstants.URL_SUPERVISION_MOVIL_SEGURIDAD_SAVE_LIST;
        try{
            JSONObject jsonParams = new JSONObject();
            SupervisionMovil supervisionMovil = new SupervisionMovil();
            supervisionMovil.setTipo(PuntoControlConstants.tipoSupervision.SEGURIDAD);
            supervisionMovil.setEstado(PuntoControlConstants.estadoSupervision.REGISTRADA);
            supervisionMovil.setTramo(null);
            List<SupervisionMovil> supervisionMovilList = getSupervisionMovilService().getSupervisionMovilList(configActivity, supervisionMovil);
            final List<SupervisionMovilSeguridad> supervisionMovilSeguridadList = new ArrayList<>();
            if(supervisionMovilList != null) {
                for (SupervisionMovil _supervisionMovil : supervisionMovilList) {
                    SupervisionMovilDetalleSeguridad supervisionMovilDetalleSeguridad = new SupervisionMovilDetalleSeguridad();
                    supervisionMovilDetalleSeguridad.setFechaRegistro(_supervisionMovil.getFechaRegistro());
                    supervisionMovilDetalleSeguridad.setPlaca(_supervisionMovil.getPlaca());
                    List<SupervisionMovilDetalleSeguridad> detalle = getSupervisionMovilDetalleSeguridadService().getSupervisionMovilDetalleSeguridadList(configActivity, supervisionMovilDetalleSeguridad);
                    SupervisionMovilSeguridad supervisionMovilSeguridad = new SupervisionMovilSeguridad();
                    supervisionMovilSeguridad.setTipo(_supervisionMovil.getTipo());
                    supervisionMovilSeguridad.setTramo(_supervisionMovil.getTramo());
                    supervisionMovilSeguridad.setPlaca(_supervisionMovil.getPlaca());
                    supervisionMovilSeguridad.setCodigoOsinergmin(_supervisionMovil.getCodigoOsinergmin());
                    supervisionMovilSeguridad.setRazonSocial(_supervisionMovil.getRazonSocial());
                    supervisionMovilSeguridad.setRuc(_supervisionMovil.getRuc());
                    supervisionMovilSeguridad.setLatitud(_supervisionMovil.getLatitud());
                    supervisionMovilSeguridad.setLongitud(_supervisionMovil.getLongitud());
                    supervisionMovilSeguridad.setFechaRegistro(_supervisionMovil.getFechaRegistro());
                    supervisionMovilSeguridad.setUsuario(_supervisionMovil.getUsuario());
                    supervisionMovilSeguridad.setEstado(_supervisionMovil.getEstado());
                    supervisionMovilSeguridad.setObservacion(_supervisionMovil.getObservacion());
                    supervisionMovilSeguridad.setDetalle(detalle);
                    supervisionMovilSeguridadList.add(supervisionMovilSeguridad);
                }
            }
            jsonParams.put("info",supervisionMovilSeguridadList);
            Log.d("<ConfigActivity:sendSupervisionSeguridadToServer:supervisionMovilSeguridadList>",jsonParams.toString());
            StringEntity stringEntity = new StringEntity(jsonParams.toString());
            client.post(configActivity, url, stringEntity, "application/json", new AsyncHttpResponseHandler() {

                @Override
                public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                    try {
                        List<SupervisionMovil> supervisionMovilList = getSupervisionMovilService().getSupervisionMovilList(configActivity, null);
                        for(SupervisionMovilSeguridad supervisionMovilSeguridad : supervisionMovilSeguridadList){
                            for(SupervisionMovil supervisionMovil : supervisionMovilList){
                                if(supervisionMovil.getTipo().equals(PuntoControlConstants.tipoSupervision.SEGURIDAD)){
                                    if(supervisionMovilSeguridad.getFechaRegistro().equals(supervisionMovil.getFechaRegistro())) {
                                        supervisionMovil.setEstado(PuntoControlConstants.estadoSupervision.ENVIADA);
                                    }
                                }
                            }
                        }
                        getSupervisionMovilService().saveSupervisionMovilListToLocal(configActivity, supervisionMovilList);
                        txtFaltantesSeguridad.setText(getSupervisionMovilService().getSupervisionSeguridadPendiente());
                        imgSyncSeguridad.stop();
                        showToast(configActivity, R.string.config_supervisiones_seguridad_finalizada, Toast.LENGTH_SHORT);
                    } catch (Exception e) {
                        imgSyncSeguridad.stop();
                        showToast(configActivity, R.string.error_json_generic, Toast.LENGTH_SHORT);
                    }
                }


                @Override
                public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                    imgSyncSeguridad.stop();
                    if (statusCode == 404) {
                        showToast(configActivity, R.string.error_http_404, Toast.LENGTH_SHORT);
                    }
                    // When Http response code is '500'
                    else if (statusCode == 500) {
                        showToast(configActivity, R.string.error_http_500, Toast.LENGTH_SHORT);
                    }
                    // When Http response code other than 404, 500
                    else {
                        showToast(configActivity, R.string.error_http_other, Toast.LENGTH_SHORT);
                    }
                }
            });
        }catch(Exception e){
            imgSyncSeguridad.stop();
            showToast(configActivity, R.string.error_json_generic, Toast.LENGTH_SHORT);
        }
    }

    private void getUnidadOperativaFromServer(){

        AsyncHttpClient client = new AsyncHttpClient();
        String url = PuntoControlConstants.URL_UNIDADOPERATIVA_LIST;
        client.get(url, null, new AsyncHttpResponseHandler() {

            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                try {
                    List<UnidadOperativa> result = new ArrayList<>();
                    // JSON Object
                    JSONArray list = new JSONArray(new String(responseBody));
                    for (int i = 0; i < list.length(); i++) {
                        JSONObject obj = list.getJSONObject(i);
                        UnidadOperativa unidadOperativa = new UnidadOperativa();
                        unidadOperativa.setCodigo(obj.getInt("codigo"));
                        unidadOperativa.setCodigoOsinergmin(obj.getString("codigoOsinergmin"));
                        unidadOperativa.setRegistroHidrocarburos(obj.getString("registroHidrocarburos"));
                        unidadOperativa.setRuc(obj.getString("ruc"));
                        unidadOperativa.setRazonSocial(obj.getString("razonSocial"));
                        unidadOperativa.setDireccion(obj.getString("direccion"));
                        unidadOperativa.setDepartamento(obj.getString("departamento"));
                        unidadOperativa.setProvincia(obj.getString("provincia"));
                        unidadOperativa.setDistrito(obj.getString("distrito"));
                        unidadOperativa.setTipo(obj.getString("tipo"));
                        unidadOperativa.setPlaca(obj.getString("placa"));
                        unidadOperativa.setCapacidad(obj.getDouble("capacidad"));
                        unidadOperativa.setFechaActualizacion(new Date());
                        unidadOperativa.setActivo(true);
                        result.add(unidadOperativa);
                    }
                    getUnidadOperativaService().saveUnidadOperativaListToLocal(configActivity, result);
                    imgSyncUnidadOperativa.stop();
                    showToast(configActivity, R.string.config_sincronizar_unidades_operativas_finalizada, Toast.LENGTH_SHORT);
                } catch (Exception e) {
                    imgSyncUnidadOperativa.stop();
                    showToast(configActivity, R.string.error_json_generic, Toast.LENGTH_SHORT);
                }
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                imgSyncUnidadOperativa.stop();
                if (statusCode == 404) {
                    showToast(configActivity, R.string.error_http_404, Toast.LENGTH_SHORT);
                }
                // When Http response code is '500'
                else if (statusCode == 500) {
                    showToast(configActivity, R.string.error_http_500, Toast.LENGTH_SHORT);
                }
                // When Http response code other than 404, 500
                else {
                    showToast(configActivity, R.string.error_http_other, Toast.LENGTH_SHORT);
                }
            }
        });
    }

    private void getOrdenPedidoFromServer(){
        AsyncHttpClient client = new AsyncHttpClient();
        String url = PuntoControlConstants.URL_ORDENPEDIDO_LIST;
        client.get(url,null ,new AsyncHttpResponseHandler() {

            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                try {
                    List<OrdenPedido> result = new ArrayList<>();
                    // JSON Object
                    JSONArray list = new JSONArray(new String(responseBody));
                    for(int i = 0; i < list.length(); i++){
                        JSONObject obj = list.getJSONObject(i);
                        OrdenPedido ordenPedido = new OrdenPedido();
                        ordenPedido.setCodigo(obj.getInt("codigo"));
                        ordenPedido.setPlaca(obj.getString("placa"));
                        ordenPedido.setCodigoAutorizacion(obj.getString("codigoAutorizacion"));
                        try {
                            ordenPedido.setNumeroFactura(obj.getString("numeroFactura"));
                        }catch(Exception e){
                            Log.d("<LoginActivity:findOrdenPedidoOnServer:numeroFactura>", e.getMessage());
                        }
                        try {
                            ordenPedido.setNumeroGuia(obj.getString("numeroGuia"));
                        }catch(Exception e){
                            Log.d("<LoginActivity:findOrdenPedidoOnServer:numeroGuia>",e.getMessage());
                        }
                        ordenPedido.setFechaDespacho(new Date(obj.getLong("fechaDespacho")));
                        try {
                            ordenPedido.setFechaVenta(new Date(obj.getLong("fechaVenta")));
                        }catch(Exception e) {
                            Log.d("<LoginActivity:findOrdenPedidoOnServer:fechaVenta>",e.getMessage());
                        }
                        ordenPedido.setEstado(obj.getString("estado"));
                        result.add(ordenPedido);
                    }
                    getOrdenPedidoService().saveOrdenPedidoListToLocal(configActivity, result);
                    imgSyncOrdenPedido.stop();
                    showToast(configActivity, R.string.config_sincronizar_orden_pedido_finalizada, Toast.LENGTH_SHORT);
                } catch (Exception e) {
                    imgSyncOrdenPedido.stop();
                    showToast(configActivity, R.string.error_json_generic, Toast.LENGTH_SHORT);
                }
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                imgSyncOrdenPedido.stop();
                if(statusCode == 404){
                    showToast(configActivity, R.string.error_http_404, Toast.LENGTH_SHORT);
                }
                // When Http response code is '500'
                else if(statusCode == 500){
                    showToast(configActivity, R.string.error_http_500, Toast.LENGTH_SHORT);
                }
                // When Http response code other than 404, 500
                else{
                    showToast(configActivity, R.string.error_http_other, Toast.LENGTH_SHORT);
                }
            }
        });
    }


    private void getProductoFromServer(){

        AsyncHttpClient client = new AsyncHttpClient();
        String url = PuntoControlConstants.URL_PRODUCTO_GET;
        client.get(url,null ,new AsyncHttpResponseHandler() {

            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                try {
                    List<Producto> result = new ArrayList<>();
                    // JSON Object
                    JSONArray list = new JSONArray(new String(responseBody));
                    for(int i = 0; i < list.length(); i++){
                        JSONObject obj = list.getJSONObject(i);
                        Producto producto = new Producto();
                        producto.setCodigo(obj.getInt("codigo"));
                        producto.setDescripcion(obj.getString("descripcion"));
                        producto.setDescripcionCorta(obj.getString("descripcionCorta"));
                        result.add(producto);
                    }
                    getProductoService().saveProductoListToLocal(configActivity, result);
                    imgSyncProducto.stop();
                    showToast(configActivity, R.string.config_sincronizar_productos_finalizada, Toast.LENGTH_SHORT);
                } catch (Exception e) {
                    imgSyncProducto.stop();
                    showToast(configActivity, R.string.error_json_generic, Toast.LENGTH_SHORT);
                }
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                imgSyncProducto.stop();
                if(statusCode == 404){
                    showToast(configActivity, R.string.error_http_404, Toast.LENGTH_SHORT);
                }
                // When Http response code is '500'
                else if(statusCode == 500){
                    showToast(configActivity, R.string.error_http_500, Toast.LENGTH_SHORT);
                }
                // When Http response code other than 404, 500
                else{
                    showToast(configActivity, R.string.error_http_other, Toast.LENGTH_SHORT);
                }
            }
        });
    }

    private void getGuiaFiscalizacionFromServer(){

        AsyncHttpClient client = new AsyncHttpClient();
        String url = PuntoControlConstants.URL_GUIASUPERVISION_SEGURIDAD_GET;
        client.get(url, null, new AsyncHttpResponseHandler() {

            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                try {
                    List<GuiaFiscalizacionDetalle> result = new ArrayList<>();
                    // JSON Object
                    JSONArray list = new JSONArray(new String(responseBody));
                    for(int i = 0; i < list.length(); i++){
                        JSONObject obj = list.getJSONObject(i);
                        GuiaFiscalizacionDetalle guiaFiscalizacionDetalle = new GuiaFiscalizacionDetalle();
                        guiaFiscalizacionDetalle.setCodigo(obj.getInt("codigo"));
                        guiaFiscalizacionDetalle.setCodigoObservacion(obj.getString("codigoObservacion"));
                        guiaFiscalizacionDetalle.setCodigoGuia(obj.getInt("guia"));
                        guiaFiscalizacionDetalle.setDescripcion(obj.getString("descripcion"));
                        guiaFiscalizacionDetalle.setBaseLegal(obj.getString("baseLegal"));
                        result.add(guiaFiscalizacionDetalle);
                    }
                    // Se almacena la información en un archivo plano
                    getGuiaFiscalizacionDetalleService().saveGuiaFiscalizacionDetalleListToLocal(configActivity, result);
                    imgSyncGuiaFiscalizacion.stop();
                    showToast(configActivity, R.string.config_sincronizar_guia_fiscalizacion_finalizada, Toast.LENGTH_SHORT);
                } catch (Exception e) {
                    imgSyncGuiaFiscalizacion.stop();
                    showToast(configActivity, R.string.error_json_generic, Toast.LENGTH_SHORT);
                }
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                imgSyncGuiaFiscalizacion.stop();
                if(statusCode == 404){
                    showToast(configActivity, R.string.error_http_404, Toast.LENGTH_SHORT);
                }
                // When Http response code is '500'
                else if(statusCode == 500){
                    showToast(configActivity, R.string.error_http_500, Toast.LENGTH_SHORT);
                }
                // When Http response code other than 404, 500
                else{
                    showToast(configActivity, R.string.error_http_other, Toast.LENGTH_SHORT);
                }
            }
        });
    }
}
